package my.design.facade;

import java.util.List;

/**
 * @author zp
 * @version 1.0
 * @description: 外观类
 * 外观设计模式
 * 外观模式也叫门面模式，主要解决的是降低调用方的使用接口的复杂逻辑组合。这样调用方与实际的接
 * 口提供方提供方提供了一个中间层，用于包装逻辑提供API接口。有些时候外观模式也被用在中间件
 * 层，对服务中的通用性复杂逻辑进行中间件层包装，让使用方可以只关心业务开发
 *
 * 定义一个顶层的接口或者抽象类
 * 让其他具体实现的类 继承或者实现顶层的接口或者抽象类
 * 然后找一个外观类 聚合了所有的实现类 通过提供统一的外观类给客户端调用 起到隔离的作用
 *
 *
 * @date 2022/10/14 19:14
 */
public class Project {
    /**
     * 项目名称
     */
    private final String name;

    /**
     * 产品经理
     */
    private final ProjectManager projectManager;

    /**
     * 开发经理
     */
    private final DevelopManager developManager;

    /**
     * 开发攻城狮们
     */
    private final List<DevelopmentEngineer> engineerList;

    /**
     * 测试攻城狮
     */
    private final List<QualityAssurance> assuranceList;

    /**
     * 运维攻城狮
     */
    private final List<Operations> operationsList;

    public Project(String name, ProjectManager projectManager, DevelopManager developManager, List<DevelopmentEngineer> engineerList, List<QualityAssurance> assuranceList, List<Operations> operationsList) {
        this.name = name;
        this.projectManager = projectManager;
        this.developManager = developManager;
        this.engineerList = engineerList;
        this.assuranceList = assuranceList;
        this.operationsList = operationsList;
    }

    /**
     * 开发过程
     */
    public void developProject() {
        System.out.println(this.name + " 项目启动...");
        System.out.println("-----------------------------");
        //指定计划
        projectManager.makeProjectPlan();

        //需求分析
        projectManager.analysisRequirement();

        //软件设计
        developManager.makeDevelopmentPlan();

        //程序编写
        engineerList.forEach(DevelopmentEngineer::develop);

        //软件测试
        assuranceList.forEach(QualityAssurance::test);

        //运行维护
        operationsList.forEach(Operations::operationAndMaintenance);

        System.out.println("-----------------------------");
        System.out.println(this.name + " 项目完成...");
    }
}

